# @Time:2021/6/8 15:09
# @Author:5120195554王欣霏
# -*- coding = utf-8 -*-

import pygame
import os
import actor
from pygame.locals import *


# 孙悟空
class SWK(pygame.sprite.Sprite):
    def __init__(self):  # 载入图片资源并设置位置信息
        pygame.sprite.Sprite.__init__(self)  # 调用父类的构造函数

        # 多张图片载入的时候 这样写就不行了
        # img_path = os.path.join("../resource","img","swk","00000.tga") #.tga是动画格式 帧格式
        # self.swk_image = pygame.image.load(img_path)

        # 1.这里的pos_x和pos_y只是相对于窗体来说的 不是相对于图片来说的
        # 2.改进后的pos_x和pos_y就是全局位置了
        self.swk_pos_x = 240
        self.swk_pos_y = 370

        # self.frame_images = [] #存放需要用到的所有图片
        # self.frame_index = 0 #标记 记录当前图片的下标
        # self.frame_count = 4 #存放图片的数量
        #
        # for i in range(0,4):#加入图片
        #     img_path = os.path.join('../resource', 'img', 'swk', str.format("%05d" % i) + '.tga') #五位整数
        #     self.frame_images.append(pygame.image.load(img_path))
        self.walk_frames = actor.DirAction('swk', '', '', 4, 4, True)
        self.dir = 0

        # 增加孙悟空的rect属性
        self.rect = pygame.Rect(self.swk_pos_x + 34, self.swk_pos_y + 180, 30, 10)  # 适当调整孙悟空的碰撞区域 为了碰撞更精准

        # 在pygame中对按键的连续检测是默认失能的
        # 调用以下函数就可以使按键连续检测
        # 第一个参数影响着按键的灵敏度 第二个参数影响着按键的移动时间间隔
        pygame.key.set_repeat(100, 100)

        self.hp = 100  # 血量

    def draw(self, surface: pygame.Surface, win_posx, win_posy):  # 将精灵画在surface上  第三四个参数是窗体相较于图片的偏移位置
        # current_frame = self.get_curr_frame() #取出当前应该画的图片
        current_frame = self.walk_frames.get_curr_frame(self.dir)
        # swk_pos_x和swk_pos_y是全局位置   用全局位置-窗体位置就可以得到孙悟空在屏幕中的偏移
        surface.blit(current_frame, (self.swk_pos_x - win_posx, self.swk_pos_y - win_posy))

    def set_pos(self, init_pos_x, init_pos_y):  # 设置位置的函数  第二个参数和第三个参数是起始的位置（全局位置）
        self.swk_pos_x = init_pos_x
        self.swk_pos_y = init_pos_y

    def key_move(self, pressed_key: int, key_click: bool,
                 obstacle_group: pygame.sprite.Group):  # 关于孙悟空移动的函数 第三个参数是用于判断键是否按下
        if not key_click:  # 如果键没有被按下 返回的偏移量就为[0,0]
            return [0, 0]
        # 用局部变量把当前的位置存下来
        pos_x = self.swk_pos_x
        pos_y = self.swk_pos_y
        # 这里将运行的方向写死了 不行
        # self.swk_pos_x += vx
        # self.swk_pos_y += vy
        if pressed_key == K_UP:  # 左上方向
            self.dir = 2
            # self.swk_pos_x -= 10
            # self.swk_pos_y -= 10
            # return [-10,-10]
            # 先改变局部变量的值 判断是否碰撞到障碍物了 再决定要不要进行对真实值赋值
            pos_x -= 10
            pos_y -= 10
        elif pressed_key == K_DOWN:  # 右下方向
            self.dir = 0
            # self.swk_pos_x += 10
            # self.swk_pos_y += 10
            # return [10,10]
            pos_x += 10
            pos_y += 10
        elif pressed_key == K_LEFT:  # 左下方向
            self.dir = 1
            # self.swk_pos_x -= 10
            # self.swk_pos_y += 10
            # return [-10,10]
            pos_x -= 10
            pos_y += 10
        elif pressed_key == K_RIGHT:  # 右上方向
            self.dir = 3
            # self.swk_pos_x += 10
            # self.swk_pos_y -= 10
            # return [10,-10]
            pos_x += 10
            pos_y -= 10
        else:
            return [0, 0]
        self.rect = pygame.Rect(pos_x + 70, pos_y + 190, 30, 10)  # 将碰撞处设置在脚部
        collide_list = pygame.sprite.spritecollide(self, obstacle_group, False)
        if len(collide_list) > 0:  # 存在有碰上的障碍物则不能移动
            return [0, 0]
        else:  # 没有障碍物就返回移动的距离
            return self.move()

    # 当没有碰上时 调用此函数
    def move(self):
        if self.dir == 2:
            x = -10
            y = -10
        elif self.dir == 0:
            x = 10
            y = 10
        elif self.dir == 1:
            x = -10
            y = 10
        elif self.dir == 3:
            x = 10
            y = -10
        self.swk_pos_x += x
        self.swk_pos_y += y
        return [x, y]  # 返回偏移量 以便改变窗口的位置

    # def get_curr_frame(self):#找到当前要画的图
    #     current_img = self.frame_images[self.frame_index]
    #     if self.frame_index + 1 >= self.frame_count:#边界判断
    #         self.frame_index = 0
    #     else:
    #         self.frame_index += 1
    #     return current_img
